Skip to main content

⚙️ Execvp() Fonksiyonu Kullanımı: C/C++ ile Harici Program Çalıştırma


📘 Bu Rehberde Ne Öğreneceksiniz?

Bu rehberde, Unix tabanlı sistemlerdeki güçlü bir sistem çağrısı olan execvp() fonksiyonunu öğreneceksiniz.
C/C++ programınızdan harici programları veya kabuk komutlarını nasıl çalıştırabileceğinizi, ayrıca “fork-exec” modelinin nasıl çalıştığını adım adım göreceksiniz.


🧠 1. Execvp() Fonksiyonu Nedir?

execvp() fonksiyonu, mevcut işlemi (process) yeni bir programın görüntüsüyle değiştirir.
Bu sayede C programınız başka bir programı doğrudan sistem düzeyinde çalıştırabilir.

ÖzellikAçıklama
💡 AmaçC programı içinden harici komut veya program çalıştırmak
🚫 KısıtlamaSadece Unix/Linux sistemlerinde çalışır
⚙️ Sonuçexecvp() çağrısından sonraki kodlar artık çalışmaz

🧩 2. Sözdizimi (Syntax) ve Parametreler

Bu fonksiyon, <unistd.h> başlık dosyasında tanımlıdır:

#include <unistd.h>

int execvp(const char* komut, char* argumanListesi[]);

🔹 Parametre Açıklamaları

komut (command): Çalıştırılacak harici programın adı (örneğin "ls"). Bu programın PATH ortam değişkeninde bulunması gerekir.

argumanListesi (argv): Komutun argümanlarını içeren char* dizisidir. Dizinin son elemanı NULL olmalıdır.


char* arguman_listesi[] = {"ls", "-l", NULL}; // "ls -l" komutu
execvp("ls", arguman_listesi);

🧠 Kural: argv dizisi NULL ile sonlanmazsa, program beklenmedik şekilde çöker.


🚀 3. Doğrudan execvp() Kullanımı

execvp() çağrıldığında, mevcut C programı anında yeni programla değiştirilir. Yani execvp()’den sonraki hiçbir satır artık çalışmaz.

📄 Kod Örneği


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
char* komut = "ls";
char* arguman_listesi[] = {"ls", "-l", NULL};

printf("Execvp() çağrılmadan önce\n");

int durum = execvp(komut, arguman_listesi);

if (durum == -1) {
perror("execvp hatası");
exit(1);
}

printf("Bu satır asla yazdırılmayacak!\n");
return 0;
}

🧾 Çıktı:


Execvp() çağrılmadan önce
total 3
-rwxrwxrwx 1 user user 22088 Kas 10 16:37 a.out
...

execvp() başarılı çalıştığında, program artık “ls -l” komutunun kontrolündedir.


🔄 4. Kontrolü Korumak: Fork-Exec Modeli

C programınızın yürümeye devam etmesini istiyorsanız, execvp()’yi doğrudan değil, fork() ile kullanmalısınız. Bu yöntemle ana program (ebeveyn süreç) devam eder, komut ise yeni bir alt süreçte (child process) çalıştırılır.

FonksiyonGörevi
fork()Yeni bir alt işlem oluşturur.
execvp()Alt işlemi yeni programla değiştirir.
wait()Üst işlemin, alt işlemin bitmesini beklemesini sağlar.

💻 Fork-Exec Modeli Örneği


#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
char* komut = "ls";
char* arguman_listesi[] = {"ls", "-l", NULL};

printf("Execvp() çağrılmadan önce\n");
printf("Yeni işlem fork() ile oluşturuluyor...\n");

pid_t pid = fork();

if (pid == 0) {
// Alt süreç
int durum = execvp(komut, arguman_listesi);
if (durum == -1) {
perror("execvp hatası");
return 1;
}
}
else if (pid > 0) {
// Üst süreç
wait(NULL);
printf("\nÜst süreç: C programı çalışmaya devam ediyor.\n");
}
else {
perror("fork hatası");
return 1;
}

return 0;
}

🧾 Beklenen Çıktı:


Execvp() çağrılmadan önce
Yeni işlem fork() ile oluşturuluyor...
total 3
-rwxrwxrwx 1 user user 22088 Kas 10 16:37 a.out
...

Üst süreç: C programı çalışmaya devam ediyor. Böylece hem komut çalıştırılır hem de ana program kapanmaz.


📊 5. Zaman ve Bellek Etkisi

ÖzellikAçıklama
Performansexecvp() doğrudan sistem çağrısı olduğundan hızlıdır.
Bellek Kullanımıfork() ile ek süreç oluşturulması bellek maliyetini artırabilir.
Hata DurumuBaşarısız çağrılarda -1 döner ve errno hata kodunu ayarlar.

❓ 6. Sıkça Sorulan Sorular (SSS)

1. execvp() ile system() farkı nedir?

system() kabuk (shell) üzerinden komut çalıştırır ve geri döner. execvp() ise mevcut süreci doğrudan değiştirir. Daha verimlidir.

2. NULL neden gerekli?

Dizi sonunu belirtmek için gereklidir. Aksi halde bellek taşması olur.

3. fork() neden iki kez çalışıyor gibi görünüyor?

fork() ana işlemi kopyalar, bu yüzden iki ayrı süreç oluşur.

4. execvp() Windows’ta neden çalışmaz?

Çünkü sadece POSIX (UNIX) standartlarını destekleyen sistemlerde geçerlidir.

5. Bulut sistemlerinde nerede kullanılır?

Daemon, izleme aracı, mikroservis veya altyapı otomasyonu gibi uygulamalarda alt süreç başlatmak için kullanılır.


🏁 Sonuç

execvp() fonksiyonu, C programınızdan harici komutları çalıştırmak için düşük seviyeli ve güçlü bir araçtır. Ancak kontrolü kaybetmemek için fork-exec modelini benimsemek gerekir.

☁️ Bu yapıyı, Rabisu Bulut altyapısında çalışan C tabanlı izleme, otomasyon veya sistem yönetimi uygulamalarınızda güvenle kullanabilirsiniz.